#include "Int_Radio.h"
#include "Dri_Timer_2.h"
#include "Dri_Grip.h"
#include "Int_Buzzer.h"

/** 雷达扫描时间周期 */
static u8 S_RADIO_SCAN_TIME = 100;
/** 雷达扫描时间状态 0 = 扫描没有完成, 1= 扫描完成 */
static bit S_RADIO_SCAN_START = 0;
/** 雷达扫描获取距离,默认最大 */
static u16 S_RADIO_SCAN_DISTANCE = 0X1111;

/**
 * @brief 超声波雷达初始化
 *
 */
void Int_Radio_Init()
{
    // 初始化GRIO
    RADIO_ECHO = 0;
    RADIO_TRIG = 0;

    // 定义定时器0,进行计数
    EA = 1;
    // 不用开启中断函数,只要可以计数就可以
    ET0 = 0;
    // 定义定时器类型  GATE = 1 (外部计数) C/T = 0 内部定时 m1m0 = 01 16位定时器/计数器，TL0、TH0全用
    // 因为他的外部触发GPIO,就是外部中断0的外设
    TMOD &= 0Xf0;
    TMOD |= 0X09;
    // 初始化计算,默认都是0
    TL0 = 0;
    TH0 = TL0;
    // 使用外部计算
    TR0 = 1;

    // 定义外部中断0
    EX0 = 1;
    // 使用下降沿
    IT0 = 1;
    // 定义优先级,这个中断的优先级最大
    PX0 = 1;
    // 最后一位设置为0
    IPH &= 0XFE;
    IPH |= 0X01;

    // 添加回调函数
    Dri_Timer_AddCallBack(Int_Radio_Timer2_Back);
}

/**
 * @brief 外部中断0 的触发函数
 *
 */
void Int_Radio_Hader() interrupt 0
{
    // 告诉外界,雷达发送的测距已经完成
    S_RADIO_SCAN_START = 1;
}

/**
 * @brief 用于每100毫秒雷达扫描一次
 *
 */
void Int_Radio_Timer2_Back()
{
    if (S_RADIO_SCAN_TIME < 100) {
        S_RADIO_SCAN_TIME++;
    }
}

/**
 * @brief 超声波雷达开始扫描
 *
 */
u16 Int_Radio_Start()
{
    // 100毫秒,扫描一次
    if (S_RADIO_SCAN_TIME >= 100) {
        // 发送开始扫描信号
        RADIO_TRIG = 1;
        Delay_10us();
        // 拉低,为了下次使用
        RADIO_TRIG        = 0;
        S_RADIO_SCAN_TIME = 0;
    }

    // 判断是不是有测量完成的距离
    if (S_RADIO_SCAN_START) {
        // 获取高位
        S_RADIO_SCAN_DISTANCE = TH0;
        S_RADIO_SCAN_DISTANCE <<= 8;
        // 获取低位
        S_RADIO_SCAN_DISTANCE = S_RADIO_SCAN_DISTANCE | TL0;

        // 重置数据
        TL0 = 0;
        TH0 = 0;

        // 将计数的数量 -> 时间 -> 距离
        // 12*  (340/2)[来回一半的距离]  * X(多少数量) *1000(米 转换成 毫秒) / 11059200  -- >  (2/11) * X
        S_RADIO_SCAN_DISTANCE = (S_RADIO_SCAN_DISTANCE * 2) / 11;

        S_RADIO_SCAN_START = 0;
    }

    // 获取测量数据
    return S_RADIO_SCAN_DISTANCE;
}
